<?php

App::uses('AppModel', 'Model');

//App::import('Model', 'Recorrido​RealizadoU​suarioPara​da');
class Reserva extends AppModel {
    /**
     * 				MODEL DATA MEMBERS
     */

    /**
     * Nombre de la tabla en base de datos
     *
     * Tabla relacionada con el modelo en cuestión, este atributo será usado para la generación
     * de consultas a la base de datos
     *
     * @var string
     */
    public $useTable = "reservas";

    /**
     * Clave primaria de la tabla en base de datos
     *
     * Clave primaria que identifica cada registro de la tabla en cuestión
     *
     * @var string
     */
    public $primaryKey = "id_reserva";

    /**
     * Campo de la tabla a usar como etiqueta/descripción
     *
     * Nombre del campo que se mostrara cuando se hacen busquedas del modelo mediante el método finde('list')
     *
     * @var string
     */
    public $displayField = "id_reserva";

    /**
     * Nivel de recusividad para la busqueda de entidades relacionadas
     *
     * Este campo sirve para indicar si una consulta debe incluir las entidades
     * relacionadas con el modelo en cuestión:
     * 	-1	->	Solo información de tabla
     * 	0	->	Información de tabla y de belongsTo
     * 	1	->	Información de tabla, de belongsTo y de hasOne-hasMany
     * 	2	->	Información de tabla, de belongsTo, hasOne-hasMany y hasOne-hasMany de los relacionados
     *
     * @var int
     */
    public $recursive = -1;

    /**
     * Nombre del modelo
     *
     * Nombre del modelo que especifica como referirse a el en las consultas, busquedas, ingresos y
     * otras interacciones con la base de datos.
     *
     * @var string
     */
    public $name = "Reserva";

    /**
     * Orden por defecto
     *
     * Orden por defecto para las consultas que se realicen a la base de datos,
     * se pueden incluir varios campos de la base de datos. Si se especifica
     * otro orden, este no se tiene en cuenta.
     *
     * @var array(string)
     */
    public $order = array("Reserva.fecha_creacion_reserva DESC", "Reserva.id_reserva");

    /**
     * Relaciones muchos a uno existentes del modelo
     */
    public $belongsTo = array(
        "RecorridoRealizado" => array(
            "className" => "RecorridoRealizado",
            "foreignKey" => "id_recorrido_realizado",
        ),
        "Parada" => array(
            "className" => "Parada",
            "foreignKey" => "id_parada",
        ),
    );

    /**
     * Validaciones de cada uno de los atributos del modelo
     */
    public $validate = array(
        "id_reserva" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => "update",
                "message" => "Id de la reserva no puede estar vacio",
            ),
            "naturalNumber_NoZero" => array(
                "rule" => array("naturalNumber", false),
                "message" => "Id de la reserva debe ser un número entero diferente de cero",
            ),
            "isUnique" => array(
                "rule" => array("isUnique"),
                "message" => "Id de la reserva debe ser único",
            ),
        ),
        "estado_reserva" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "Estado de la reserva no puede estar vacio",
            ),
            "inList" => array(
                "rule" => array("inList", array('programada', 'usada', 'no usada', 'cancelada')),
                "message" => "Estado de la reserva debe ser 'programada', 'cancelada', 'usada' o 'no usada'",
            ),
        ),
        "fecha_creacion_reserva" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => "create",
                "message" => "Fecha de creación de la reserva no puede estar vacio",
            ),
            "date" => array(
                "rule" => array("datetime", "ymd"),
                "message" => "Fecha de creación de la reserva debe tener formato yyyy/mm/dd hh:mm",
            ),
        ),
        "fecha_modificacion_reserva" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "Fecha de modificación de la reserva no puede estar vacio",
            ),
            "date" => array(
                "rule" => array("datetime", "ymd"),
                "message" => "Fecha de modificación de la reserva debe tener formato yyyy/mm/dd hh:mm",
            ),
        ),
        "id_recorrido_realizado" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "Id del recorrido realizado no puede estar vacio",
            ),
            "naturalNumber_NoZero" => array(
                "rule" => array("naturalNumber", false),
                "message" => "Id del recorrido realizado debe ser un número entero diferente de cero",
            ),
        ),
        "id_usuario" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "Id del usuario no puede estar vacio",
            ),
            'maxLength-2' => array(
                'rule' => array('maxLength', 15),
                'message' => 'La máxima longitud de la cédula es de 15s caracteres'
            )
        ),
        "id_parada" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "Id de la parada no puede estar vacio",
            ),
            "naturalNumber_NoZero" => array(
                "rule" => array("naturalNumber", false),
                "message" => "Id de la parada debe ser un número entero diferente de cero",
            ),
        ),
        "terminos" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => false,
                "message" => "Debe aceptar los términos y condiciones",
            ),
            "boolean" => array(
                "rule" => array("boolean"),
                "message" => "Debe aceptar los términos y condiciones",
            ),
            "inList" => array(
                "rule" => array("inList", array('1')),
                "message" => "Debe aceptar los términos y condiciones",
            ),
        ),
    );

    /**
     * 				DATA VALIDATION METHODS
     */

    /**
     * 				MODEL CALLBACKS METHODS
     */

    // public function beforeFind(array $queryData) {
    // }
    // public function afterFind(array $results, boolean $primary = false) {
    // }
    // public function beforeValidate(array $options = array()) {
    // }
    // public function beforeSave(array $options = array()) {
    // }
    // public function afterSave(boolean $created) {
    // }
    // public function beforeDelete(boolean $cascade = true) {
    // }
    // public function afterDelete() {
    // }

    /**
     * 				MODEL METHODS
     */
    public function findProgramadas($id_usuario = null) {
        if ($id_usuario == null) {
            return $this->find('all', array(
                        'conditions' => array("Reserva.estado_reserva" => "programada"),
                        'recursive' => 0,
            ));
        } else {
            return $this->find('all', array(
                        'conditions' => array("Reserva.estado_reserva" => "programada", "Reserva.id_usuario" => $id_usuario),
                        'recursive' => 0,
            ));
        }
    }

    public function findNoProgramadas($id_usuario = null) {
        if ($id_usuario == null) {
            return $this->find('all', array(
                        'conditions' => array("Reserva.estado_reserva !=" => "programada"),
                        'recursive' => 0,
                        'limit' => 10
            ));
        } else {
            return $this->find('all', array(
                        'conditions' => array("Reserva.estado_reserva !=" => "programada", "Reserva.id_usuario" => $id_usuario),
                        'recursive' => 0,
                        'limit' => 10
            ));
        }
    }

    /**
     * Funcion para verificar cada una de las reservas, que si se hayan utilizado
     * @return 1 ó 0
     */
    public function verificarReservas($id_recorrido_realizado = null) {
        if ($id_recorrido_realizado) {
            $RecorridoRealizadoUsuarioParada = ClassRegistry::init('RecorridoRealizadoUsuarioParada');
            $rrup = $RecorridoRealizadoUsuarioParada->find('all', array('conditions' => array(
                    'RecorridoRealizadoUsuarioParada.id_recorrido_realizado' => $id_recorrido_realizado
            )));
            $reservas = $this->find('all', array('conditions' => array(
                    'Reserva.id_recorrido_realizado' => $id_recorrido_realizado,
                    'Reserva.estado_reserva' => 'programada'
            )));

            if ($reservas) {
                foreach ($reservas as $reserva) {
                    $i = 0;
                    while ($i < sizeof($rrup) && $reserva['Reserva']['id_usuario'] != $rrup[$i]['RecorridoRealizadoUsuarioParada']['id_usuario'])
                        $i++;

                    if ($i != sizeof($rrup)) {
                        $reserva['Reserva']['estado_reserva'] = "usada";
                    } else {
                        $reserva['Reserva']['estado_reserva'] = "no usada";
                    }
                    $this->save($reserva, false);
                }
            }
        }
    }

    /**
     * Descripcion corta metodo.
     *
     * Descripción larga metodo
     *
     * @param array() $data parametro que sirve para..
     * @param boolean $validate parametro que sirve para..
     * @param boolean $fieldList parametro que sirve para..
     * @return boolean true en caso de exito, false en otro caso
     */
    public function save($data = null, $validate = true, $fieldList = array()) {
        $this->set($data);
        if (!isset($data["Reserva"]['id_reserva'])) {
            $this->set(array(
                'fecha_creacion_reserva' => date("Y/m/j H:i:s"),
                'estado_reserva' => "programada",
            ));
        }
        $this->set(array(
            'fecha_modificacion_reserva' => date("Y/m/j H:i:s")
        ));
        //echo "antes de guardar";
        return parent::save($this->data, $validate, $fieldList);
    }

    /**
     * Descripcion corta metodo.
     *
     * Descripción larga metodo
     *
     * @param int $id parametro que sirve para..
     * @param boolean $cascade parametro que sirve para..
     * @return boolean true en caso de exito, false en otro caso
     */
    public function delete($id = null, $cascade = true) {
        $reserva = $this->find('first', array(
            'conditions' => array('Reserva.id_reserva' => $id),
            'recursive' => 1,
        ));

        $reserva["Reserva"]["estado_reserva"] = "cancelada";
        return $this->save($reserva);
    }

    public function findAllByIdUsuario($id_usuario = null, $start = null, $length = null, $order = array(), $filter = array(), $conditions = array(), $contain = array()) {
        $contain = array_merge($contain, array(
            'Parada',
            'RecorridoRealizado' => array(
                'Recorrido' => array(
                    'Ruta'
                )
            )
        ));
        $conditions = array_merge($conditions, array('Reserva.id_usuario' => $id_usuario));
        return parent::findAll($start, $length, $order, $filter, $conditions, $contain);
    }

    public function findCountAllByIdUsuario($id_usuario = null, $filter = array(), $conditions = array(), $contain = array()) {
        $contain = array_merge($contain, array(
            'Parada',
            'RecorridoRealizado' => array(
                'Recorrido' => array(
                    'Ruta'
                )
            )
        ));
        $conditions = array_merge($conditions, array('Reserva.id_usuario' => $id_usuario));
        return parent::findCountAll($filter, $conditions, $contain);
    }

}
